//
//  Ball.m
//  Soccer
//
//  Created by Hyun-Woong Kim on 09. 05. 08.
//  Copyright 2009 __MyCompanyName__. All rights reserved.
//

#import "Ball.h"
#import "ClientManager.h"
#import "NetworkManager.h"
#import "GameLayer.h"
#import "PASoundSource.h"

#import "Constant.h"

@implementation Ball

- (id)initWithPosition:(CGPoint)pos dirRad:(double)rad speed:(int)sp
{
	if (self = [super initWithPosition:pos dirRad:rad speed:sp])
	{
		owner = nil;
		shooter = nil;
		speed = 4;
		goalDurationByFrame = 0;
	}
	return self;
}

@synthesize owner;
@synthesize shooter;
@synthesize shootTime;
@synthesize miniMapBall;

- (NSString *)getFileName
{
	return @"Ball4.png";
}

- (void)moveToNextPosition
{
	// 공을 가지고 있는 플레이어가 있을 경우 플레이어의 위치에 따라서 공의 위치를 결정한다.
	if (owner != nil)
	{
		position = prevPosition = owner.position;
		position.x += 20 * cos(owner.dirRad);
		position.y += 20 * sin(owner.dirRad);
	}
	// Ball is moving alone.
	else
	{
		// 서버 모드 일 때만 골 뺏기 판정한다.
		if ([NetworkManager sharedNetworkManager].networkMode == ServerMode)
		{
			// if shooter exists
			if (shooter != nil)
			{
				// 만약 볼 근처에 플레이어가 있다면, 볼을 해당 플레이어가 가지도록 한다.
				NSMutableArray *players = [ClientManager sharedManager].match.players;
				
				// 가로채기 체크
				for (Player *player in players)
				{
					double currDistance = [self getDistanceFrom:position To:player.position];
					
					if(currDistance <= 20.0)
					{
						// 공이 player에게로 가까워지고 있나?
						double prevDistance = [self getDistanceFrom:prevPosition To:player.position];
						
						// if ball is getting closer to this player and close enough to this player,
						// let this player have this ball.
						if( currDistance < prevDistance )
						{
							// 골키퍼가 골을 잡았다.
							// 일단 무조건 중앙에서 경기 재개한다.
							if ([player isKindOfClass:[GoalKeeper class]])
							{
								shooter = player;
								if (player.team == TeamA)
								{
									dirRad = 0;
								}
								else
								{
									dirRad = kPi;
								}
								break;
							}
							// 일반 선수
							else
							{
								owner = player;
								shooter = nil;
								shootTime = 0;
								isMoving = NO;
								break;
							}
						}
					}
				}
			}
			else
			{
				NSLog(@"Ball is moving but shooter is nil!");
			}
		}
		
		// 골인 판정
		// 골인이 발생하면 얼럿창 띄우고, 중앙에서 경기 재개한다.
		NSString* msg = NULL;
		Stadium* stadium = [[ClientManager sharedManager].match getStadium];
		CGRect a = stadium.teamAGoalPostBounds;
		CGRect b = stadium.teamBGoalPostBounds;
		int goal;
		
		BOOL Ax = position.x <= a.origin.x + a.size.width;
		BOOL Ay = position.y >= a.origin.y && position.y <= a.origin.y+a.size.height;
		BOOL Bx = position.x >= b.origin.x;
		BOOL By = position.y >= b.origin.y && position.y <= b.origin.y+b.size.height;
		
		if( (Ax && Ay) || (Bx && By) )
		{
			if (Ax && Ay)
			{
				msg = @"Goal in goalpost A";
				goal = 0;
			}
			else if (Bx && By)
			{
				msg = @"Goal in goalpost B";
				goal = 1;
			}
			
			inGoalArea = YES;
		}
		else
		{
			// 방금까지 골 에어리어 안에 있었다면 이제 다시 골을 넣을 수 있는 상태가 되었다.
			if(inGoalArea == YES)
			{
				goalDurationByFrame = 0;
				inGoalArea = NO;
			}
		}
		
		if(msg != NULL)
		{
			
			//UIAlertView* alertView = [[UIAlertView alloc] initWithTitle:@"Goal" message:msg delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
			//[alertView show];
			//[alertView release];
			msg = NULL;
			
			if(goalDurationByFrame <= 0)
			{
				/* Goal in Sound play */
				Match* aa = [ClientManager sharedManager].match;
				GameLayer *bb = aa.delegate;
				PASoundSource* cc = bb.goalIn;
				[cc playAtListenerPosition];
				
				[[NetworkManager sharedNetworkManager] goalHappened:goal];
				goalDurationByFrame = goalDuration;
			}
		}
		
		goalDurationByFrame--;
		[super moveToNextPosition];
	}
}

- (CGPoint)checkOutline:(CGPoint)pos
{
	CGSize stadiumSize = CGSizeMake(960, 640);
	if (pos.x < 0)
	{
		pos.x = -pos.x;
		dirRad = kPi - dirRad;
		//shooter = nil;
	}
	else if (pos.x > stadiumSize.width)
	{
		pos.x = stadiumSize.width * 2 - pos.x;
		dirRad = kPi - dirRad;
		//shooter = nil;
	}
	
	if (pos.y < 0)
	{
		pos.y = -pos.y;
		dirRad = -dirRad;
	}
	else if (pos.y > stadiumSize.height)
	{
		pos.y = stadiumSize.height * 2 - pos.y;
		dirRad = -dirRad;
	}
	return pos;
}

- (void)spriteNeedsUpdates:(ObjectSprite *)sprite
{
	[super spriteNeedsUpdates:sprite];
	
	/* player가 ball을 드리블하고 있는 상황 */
	if (owner != nil)
	{
		if (owner.isMoving)
		{
			if (owner.dirRad > kPi / 2 || owner.dirRad < -kPi / 2)
				sprite.rotation -= 10;
			else
				sprite.rotation += 10;
		}
	}
	/* player가 슛한 상황 */
	else
	{
		if (isMoving)
		{
			if (dirRad > kPi / 2 || dirRad < -kPi / 2)
			{
				sprite.rotation -= 20;
			}
			else
			{
				sprite.rotation += 20;
			}
		}
	}
	
	miniMapBall.position = CGPointMake(position.x/10,position.y/10);	
}

@end
